home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_se / e_strip.e < prev    next >
Text File  |  1998-12-22  |  7KB  |  328 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  4. --                       http://www.loria.fr/SmallEiffel
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it 
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later 
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License 
  11. -- for  more  details.  You  should  have  received a copy of the GNU General 
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class E_STRIP
  17.    --   
  18.    -- To store a strip expression like :
  19.    --                                        strip(foo, bar)
  20.    --
  21.  
  22. inherit EXPRESSION;
  23.       
  24. creation make
  25.    
  26. feature
  27.  
  28.    start_position: POSITION;
  29.    
  30. feature {NONE}
  31.    
  32.    list: FEATURE_NAME_LIST;
  33.  
  34. feature {E_STRIP}
  35.  
  36.    current_type: TYPE;
  37.  
  38. feature {NONE}
  39.    
  40.    make(sp: like start_position; l: like list) is
  41.       require
  42.      sp /= Void
  43.       do
  44.      start_position := sp;
  45.      list := l;
  46.       ensure 
  47.      start_position = sp;
  48.      list = l
  49.       end;
  50.    
  51. feature 
  52.  
  53.    is_current: BOOLEAN is false;
  54.  
  55.    is_writable: BOOLEAN is false;
  56.  
  57.    is_manifest_string: BOOLEAN is false;
  58.  
  59.    is_result: BOOLEAN is false;
  60.  
  61.    is_void: BOOLEAN is false;
  62.  
  63.    use_current: BOOLEAN is true;
  64.       
  65.    can_be_dropped, c_simple: BOOLEAN is false;
  66.    
  67.    is_static: BOOLEAN is false;
  68.  
  69.    is_pre_computable: BOOLEAN is false;
  70.  
  71.    isa_dca_inline_argument: INTEGER is 0;
  72.  
  73. feature
  74.  
  75.    static_value: INTEGER is
  76.       do
  77.       end;
  78.  
  79.    dca_inline_argument(formal_arg_type: TYPE) is
  80.       do
  81.       end;
  82.  
  83.    afd_check is
  84.       do
  85.       end;
  86.  
  87.    frozen mapping_c_target(target_type: TYPE) is
  88.       do
  89.      compile_to_c;
  90.       end;
  91.  
  92.    frozen mapping_c_arg(formal_arg_type: TYPE) is
  93.       do
  94.      compile_to_c;
  95.       end;
  96.  
  97.    collect_c_tmp is
  98.       do
  99.       end;
  100.  
  101.    compile_to_c is
  102.       local
  103.      wa: ARRAY[RUN_FEATURE_2]
  104.      rf2: RUN_FEATURE_2;
  105.      i: INTEGER;
  106.      ct: TYPE;
  107.       do
  108.      manifest_array_pool.c_call(result_type);
  109.      cpp.put_character('(');
  110.      ct := current_type;
  111.      wa := ct.run_class.writable_attributes;
  112.      cpp.put_integer(array_count(wa));
  113.      if wa /= Void then
  114.         from  
  115.            i := wa.upper;
  116.         until
  117.            i = 0
  118.         loop
  119.            rf2 := wa.item(i);
  120.            if list = Void or else not list.has(rf2.name) then
  121.           cpp.put_character(',');
  122.           rf2.result_type.to_reference;
  123.           cpp.put_character('(');
  124.           cpp.print_current;
  125.           if current_type.is_expanded then
  126.              cpp.put_character('.');
  127.           else
  128.              cpp.put_string("->");
  129.           end;
  130.           cpp.put_character('_');
  131.           cpp.put_string(rf2.name.to_string);
  132.           cpp.put_character(')');
  133.            end;
  134.            i := i - 1;
  135.         end;        
  136.      end;
  137.      cpp.put_character(')');
  138.       end;
  139.  
  140.    c_declare_for_old is
  141.       do 
  142.       end;
  143.       
  144.    compile_to_c_old is 
  145.       do 
  146.       end;
  147.  
  148.    compile_to_jvm_old is 
  149.       do 
  150.       end;
  151.  
  152.    compile_to_jvm is 
  153.       local
  154.      ca: like code_attribute;
  155.      cp: like constant_pool;
  156.      count, i, j, idx, idx_array, space: INTEGER;
  157.      wa: ARRAY[RUN_FEATURE_2]
  158.      rf2: RUN_FEATURE_2;
  159.       do 
  160.      ca := code_attribute;
  161.      cp := constant_pool;
  162.      wa := current_type.run_class.writable_attributes;
  163.      count := array_count(wa);
  164.      result_type.run_class.jvm_basic_new;
  165.      ca.opcode_dup;
  166.      ca.opcode_iconst_1;
  167.      idx_array := result_type.run_class.jvm_constant_pool_index;
  168.      idx := cp.idx_fieldref4(idx_array,us_lower,fz_i);
  169.      ca.opcode_putfield(idx,-2);
  170.      ca.opcode_dup;
  171.      ca.opcode_push_integer(count);
  172.      idx := cp.idx_fieldref4(idx_array,us_upper,fz_i);
  173.      ca.opcode_putfield(idx,-2);
  174.      ca.opcode_dup;
  175.      ca.opcode_push_integer(count);
  176.      idx := cp.idx_fieldref4(idx_array,us_capacity,fz_i);
  177.      ca.opcode_putfield(idx,-2);
  178.      if count > 0 then
  179.         -- pile = array 
  180.         ca.opcode_push_integer(count);
  181.         type_any.jvm_xnewarray;
  182.         -- pile = array storage
  183.         ca.opcode_dup2;
  184.         -- pile = array storage array storage
  185.         tmp_string.clear;
  186.         tmp_string.extend('[');
  187.         tmp_string.append(jvm_root_descriptor);
  188.         idx := cp.idx_fieldref4(idx_array,us_storage,tmp_string);
  189.         ca.opcode_putfield(idx,-2);
  190.         -- pile = array storage
  191.         from
  192.            i := wa.upper;
  193.            j := 0;
  194.         until
  195.            i = 0
  196.         loop
  197.            rf2 := wa.item(i);
  198.            if list = Void or else not list.has(rf2.name) then
  199.           if j < count - 1 then
  200.              ca.opcode_dup;
  201.           end;
  202.           ca.opcode_push_integer(j);
  203.           current_type.jvm_push_local(0);
  204.           idx := cp.idx_fieldref(rf2);
  205.           ca.opcode_getfield(idx,0);
  206.           space := rf2.result_type.jvm_convert_to(type_any);
  207.           result_type.jvm_xastore;
  208.           j := j + 1;
  209.            end;
  210.            i := i - 1;
  211.         end;
  212.      end;
  213.       end;
  214.    
  215.    compile_target_to_jvm is 
  216.       do 
  217.       end;
  218.    
  219.    compile_to_jvm_assignment(a: ASSIGNMENT) is
  220.       do
  221.       end;
  222.    
  223.    jvm_branch_if_false: INTEGER is
  224.       do
  225.       end;
  226.  
  227.    jvm_branch_if_true: INTEGER is
  228.       do
  229.       end;
  230.    
  231.    compile_to_jvm_into(dest: TYPE): INTEGER is
  232.       do
  233.      Result := 1;
  234.      compile_to_jvm;
  235.       end;
  236.  
  237.    result_type: TYPE_ARRAY is
  238.       once
  239.      !!Result.make(Void,type_any);
  240.      Result := Result.to_runnable(type_any);
  241.      Result.run_class.set_at_run_time;
  242.      Result.load_basic_features;
  243.      manifest_array_pool.register(Result);
  244.       end;
  245.    
  246.    to_runnable(ct: TYPE): like Current is
  247.       do
  248.      if current_type = Void then
  249.         current_type := ct;
  250.         current_type.run_class.set_strip_used;
  251.         Result := Current;
  252.      else
  253.         !!Result.make(start_position,list);
  254.         Result := Result.to_runnable(ct);
  255.      end;
  256.       end;
  257.    
  258.    pretty_print is
  259.       do
  260.      fmt.put_string("strip (");
  261.      fmt.level_incr;
  262.      if list /= Void then
  263.         list.pretty_print;
  264.      end;
  265.      fmt.put_string(")");
  266.      fmt.level_decr;
  267.       end;
  268.    
  269.    print_as_target is
  270.       do
  271.      pretty_print;
  272.      fmt.put_character('.');
  273.       end;
  274.    
  275.    bracketed_pretty_print is
  276.       do
  277.      fmt.put_character('(');
  278.      pretty_print;
  279.      fmt.put_character(')');
  280.       end;
  281.  
  282.    short is
  283.       do
  284.      short_print.hook_or("op_strip","strip (");
  285.      if list /= Void then
  286.         list.short;
  287.      end;
  288.      short_print.hook_or("cl_strip",")");
  289.       end;
  290.    
  291.    short_target is
  292.       do
  293.      short;
  294.      short_print.a_dot;
  295.       end;
  296.    
  297.    precedence: INTEGER is
  298.       do
  299.      Result := 11;
  300.       end;
  301.    
  302. feature {CREATION_CALL,EXPRESSION_WITH_COMMENT}
  303.       
  304.    jvm_assign is
  305.       do
  306.       end;
  307.  
  308. feature {NONE}
  309.  
  310.    array_count(wa: ARRAY[RUN_FEATURE_2]): INTEGER is
  311.       do
  312.      if wa /= Void then
  313.         Result := wa.count;
  314.      end;
  315.      if list /= Void then
  316.         Result := Result - list.count;
  317.      end;
  318.       ensure
  319.      Result >= 0
  320.       end;
  321.  
  322.    tmp_string: STRING is
  323.       once
  324.      !!Result.make(32);
  325.       end;
  326.  
  327. end -- E_STRIP
  328.